package xfuzzy.xfhl.controller;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import xfuzzy.Xfuzzy;
import xfuzzy.lang.Specification;
import xfuzzy.xfhl.model.XfhlData;
import xfuzzy.xfhl.model.XfhlProcess;
import xfuzzy.xfhl.view.XfhlDataView;
import xfuzzy.xfhl.view.XfhlView;

/**
 * Controlador del la herramienta Xfhl. Esta herramienta utiliza el patron
 * Modelo-Vista-Controlador
 * 
 * @author Sergio Cala Cordero, Septiembre 2009, Herramienta XFHL
 * 
 */

public class XfhlController implements ActionListener {

	/**
	 * Instancia a la vista
	 */
	private XfhlView xfhlView;

	/**
	 * Instancia al modelo
	 */
	private XfhlProcess xfhlProcess;

	/**
	 * Constructor que crea una ventana xfhlView y la pone como visible
	 * 
	 * @param xfuzzy
	 *            Instancia de la ventana principal de Xfuzzy
	 * @param original
	 *            Especificacion con lo que se ha abierto Xfhl
	 */
	public XfhlController(Xfuzzy xfuzzy, Specification original) {

		xfhlView = new XfhlView(this, xfuzzy, original);
		xfhlView.setVisible(true);
	}

	/**
	 * Ejecuta el progreso de busqueda
	 */
	private void run() {
		
		this.xfhlProcess = new XfhlProcess(this.xfhlView.getConfig());
		XfhlData[] underStudyData = this.xfhlProcess.getData();
		XfhlDataView[] underStudyDataView = new XfhlDataView[this.xfhlProcess.getConfig().getNumThread()];
		// Nos creamos los objetos xfhlDataView
		for (int i = 0; i < underStudyData.length; i++) {

			underStudyDataView[i] = new XfhlDataView(i, underStudyData[i]);
			// Añadimos el observador al objeto observado
			underStudyData[i].addObserver(underStudyDataView[i]);
		}

		// Hacemos que la vista vea los cambios
		this.xfhlProcess.addObserver(xfhlView);

		this.xfhlView.run(this.xfhlProcess, underStudyDataView);
	}

	/**
	 * Manejador de enventos
	 */
	public void actionPerformed(ActionEvent e) {

		String command = e.getActionCommand();
		System.out.println(command);

		if (command.equals("Run")) {
			run();
		} else if (command.equals("Close")) {
			this.xfhlView.dispose();
		} else if (command.equals("NewConfiguration")) {
			this.xfhlView.newConfiguration();
		} else if (command.equals("Save")) {
			this.xfhlView.saveSpecification();
		} else if (command.equals("Apply")) {
			this.xfhlView.apply();
		} else if (command.equals("EditConfiguration")) {
			this.xfhlView.editConfiguration();
		} else if (command.equals("Pause")) {
			xfhlView.pause();
		} else if (command.equals("Continue")) {
			xfhlView.contin();
		} else if (command.equals("Reload")) {
			xfhlView.reload();
		} else if (command.equals("LoadConfiguration")) {
			xfhlView.loadConfiguration();
		} else if (command.equals("SaveConfiguration")) {
			xfhlView.saveConfiguration();
		}
	}
}